home *** CD-ROM | disk | FTP | other *** search
- {***********************************************************************}
- PROGRAM ScreenPortDemo; { Sept 6/93, Greg Estabrooks. }
- USES CRT; { LastMode,Clrscr. }
- CONST
- Speed = 50; { Define speed for moving screen portion}
- {******** Change this to make the screen move faster/slower *******}
- TYPE
- ScreenPort = RECORD
- ScreenSt :ARRAY[1..4000] OF BYTE;
- NumCols,
- NumRows :BYTE;
- END;
-
- ScreenPtr = ^ScreenSet;
- ScreenSet = ARRAY[1..50,1..80,0..1] OF BYTE;
- { 1..50 = Row, 0..79 = Col, 0 = Character,
- 1 = Color Byte }
- VAR
- TextScreen :SCREENPTR;
- BaseOfScreen :WORD;
- BPort,
- SPort :ScreenPort;
- Row,Colm :WORD;
-
- PROCEDURE SaveScrPort( Col1, Row1, Col2, Row2 :BYTE; VAR ScrP :SCREENPORT );
- VAR
- LLength :BYTE;
- Counter1,Counter2 :WORD;
- BEGIN
- Counter2 := 1;
- LLength := (2 * (Col2 - Col1))+2;
- For Counter1 := Row1 To Row2 DO
- BEGIN
- Move(TextScreen^[Counter1,Col1,0],ScrP.ScreenST[Counter2],LLength);
- Inc(Counter2,LLength);
- END;
- ScrP.NumCols := LLength;
- ScrP.NumRows := Row2 - Row1;
- END;
-
- PROCEDURE RestoreScrPort( Col,Row :BYTE; VAR ScrP :SCREENPORT );
- VAR
- Counter1,Counter2 :WORD;
- BEGIN
- Counter2 := 1;
- For Counter1 := Row To (Row + ScrP.NumRows) Do
- BEGIN
- Move(ScrP.ScreenST[Counter2],TextScreen^[Counter1,Col,0],ScrP.NumCols);
- Inc(Counter2,ScrP.NumCols);
- END;
- END;
-
- BEGIN
- IF LastMode = 7 THEN { Check current video mode. }
- BaseOfScreen := $B000 { If Monochrome load mono segment. }
- ELSE
- BaseOfScreen := $B800; { if not load color segment. }
- TextScreen := Ptr(BaseOfScreen,0); { Now point TextScreen proper area.}
-
- SaveScrPort(10,5,20,15,BPort);{ Save a cleared part of the screen. }
- GotoXY(1,1); { Move to top corner of screen. }
-
- FOR Row := 1 to 20 DO { Generate screen for demonstration. }
- FOR Colm := 1 to 80 DO
- Write('A');
-
- SaveScrPort(10,5,20,15,SPort);{ Save a portion of the screen. }
- ClrScr; { Clear the screen. }
- SaveScrPort(10,5,20,15,BPort);{ Redisplay saved portion. }
-
- FOR Colm := 10 to 50 DO { Animate portion right. }
- BEGIN
- RestoreScrPort(Colm,5,SPort);
- Delay(Speed);
- RestoreScrPort(Colm,5,BPort);
- END;
-
- FOR Row := 5 to 14 DO { Animate Portion Down. }
- BEGIN
- RestoreScrPort(50,Row,SPort);
- Delay(Speed);
- RestoreScrPort(50,Row,BPort);
- END;
-
- FOR Colm := 50 DOWNTO 10 DO { Animate Portion Left. }
- BEGIN
- RestoreScrPort(Colm,14,SPort);
- Delay(Speed);
- RestoreScrPort(Colm,14,BPort);
- END;
-
- FOR Row := 14 DOWNTO 5 DO { Animate Portion Up. }
- BEGIN
- RestoreScrPort(10,Row,SPort);
- Delay(Speed);
- RestoreScrPort(10,Row,BPort);
- END;
- RestoreScrPort(10,5,SPort);
- Readln;
- END.
- {***********************************************************************}
-